package com.lzw.d25bingso.tools;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.util.LruCache;

/**
 * Created by Administrator on 2017/5/11.
 */

public class LruCacheUtils {

    private LruCache<String,Bitmap> cache;

    private ImageCallBack callBack;


    public  LruCacheUtils()
    {
        //获取当前手机的内存大小
        long maxSize = Runtime.getRuntime().maxMemory();

        //一般情况把手机内存的1/8 作为缓存图片的空间
        int cacheSize = (int)(maxSize/8);

        cache = new LruCache<String,Bitmap>(cacheSize)
        {
            //默认返回当前空间内图片的数量
            //修改为:  返回当前图片的大小
            @Override
            protected int sizeOf(String key, Bitmap value) {
                return value.getByteCount();
            }
        };
    }

    /**
     * 获取图片的方法
     * 三级缓存 得到图片
     */

    public void getBitmap(Context context,String imageUrl, ImageCallBack callBack)
    {
        this.callBack = callBack;

        //1, 从缓存中获取图片, 如果存在则取出显示; 如果不存在, 则从sd卡中获取图片
        Bitmap bitmap = cache.get(imageUrl);
        if (bitmap!=null)
        {
            callBack.sendImage(imageUrl,bitmap);

        }else
        {
            //从sd卡中获取图片, 如果sd卡中有该图片, 则取出显示并且存入缓存; 如果不存在,开启网络下载
            String fileName = imageUrl.substring(imageUrl.lastIndexOf("/")+1);
            bitmap = SdCardHelper.getBitmapPrivateCache(context,fileName);

            if (bitmap!=null)
            {
                //将获取的图片存入缓存
                cache.put(imageUrl,bitmap);

                //返回获取的图片
                callBack.sendImage(imageUrl,bitmap);

            }else
            {
                //开启网络加载图片, 存入缓存, 存入sd卡, 返回数据
                new DownLoadImageTask(context).execute(imageUrl);
            }

        }


    }


    //开启网络加载图片
    public class DownLoadImageTask extends AsyncTask<String,Void,byte[]>
    {
        private Context context;
        private String imagePath;

        public DownLoadImageTask(Context context)
        {
            this.context  =context;
        }
        @Override
        protected byte[] doInBackground(String... params) {

            imagePath = params[0];
            return HttpUtils.getByteResult(imagePath);
        }

        @Override
        protected void onPostExecute(byte[] result) {
            super.onPostExecute(result);

            if (result!=null)
            {
                //图片的二次采样
                Bitmap bitmap = getScaleBitmap(result,150,150);

                //存入缓存
                cache.put(imagePath,bitmap);

                //存入sd卡
                String fileName = imagePath.substring(imagePath.lastIndexOf("/")+1);
                SdCardHelper.saveBitmapPrivateCache(context,fileName,bitmap);

                //通过接口回调返回数据
                callBack.sendImage(imagePath,bitmap);
            }
        }
    }


    /**
     * 图片的2次采样
     *
     */
    public Bitmap getScaleBitmap(byte[] result, int newWidth, int newHeight)
    {
        //1, 得到用来设置图片属性的参数对象
        BitmapFactory.Options options = new BitmapFactory.Options();

        //2, 解码边缘
        options.inJustDecodeBounds = true;

        //3, 进行图片解码
        BitmapFactory.decodeByteArray(result,0,result.length,options);

        //4, 获得原图的宽度和高度
        int oldWidth = options.outWidth;
        int oldHeight = options.outHeight;

        //5, 得到压缩比例
        double scaleWidth = oldWidth/newWidth;
        double scaleHeight= oldHeight/newHeight;

        //6, 得到压缩的比例
        int scale = (int) Math.round(scaleWidth>scaleHeight?scaleWidth:scaleHeight);

        //7, 设置压缩的比例
        options.inSampleSize = scale;

        //8, 将图片的质量设置为RGB_565
        options.inPreferredConfig = Bitmap.Config.RGB_565;

        //9, 锁住边缘
        options.inJustDecodeBounds = false;

        //10, 通过参数对象获取新的图片
        Bitmap bitmap = BitmapFactory.decodeByteArray(result,0,result.length,options);

        return  bitmap;
    }

    /**
     * 图片的二次采样
     * @param result   图片内容
     * @param size      图片的压缩比例
     * @return
     */
    public Bitmap getScaleBitmap(byte[] result, int size)
    {
        //1, 得到用来设置图片属性的参数对象
        BitmapFactory.Options options = new BitmapFactory.Options();

        //2, 解码边缘
        options.inJustDecodeBounds = true;

        //3, 进行图片解码
        BitmapFactory.decodeByteArray(result,0,result.length,options);

        //4, 设置压缩的比例
        options.inSampleSize = size;

        //5, 将图片的质量设置为RGB_565
        options.inPreferredConfig = Bitmap.Config.RGB_565;

        //6, 锁住边缘
        options.inJustDecodeBounds = false;

        //7, 通过参数对象获取新的图片
        Bitmap bitmap = BitmapFactory.decodeByteArray(result,0,result.length,options);

        return  bitmap;
    }


    public interface  ImageCallBack
    {
        public  void sendImage(String imagePath, Bitmap bitmap);
    }
}
